package com.itheima;


import cn.itheima.health.service.OrderInfoService;
import com.itheima.constant.MessageConstant;
import com.itheima.healt.entlty.Result;
import com.itheima.pojo.Order;
import com.itheima.utils.ValidateCodeUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.Map;

@RestController
@RequestMapping("/orderinfo")
public class OrderInfoController {

    @Reference
    private OrderInfoService orderInfoService;

    @Autowired
    //使用redis 就必须 创建JedisPool 对象。
    private JedisPool jedisPool;

    @RequestMapping("/sendCodeToPhone.do")
    //   Result ： 因为前端接收的 是一个 返回级结果对象  所以这个方法 的返回值类型 是 Result
    //telephone 因为 电话号码Int 类型接受不了  所以这里是String类型
    public Result sendCodeToPhone(@RequestParam("telephone") String telephone) {
        try {
            //拿到手机号之后 我们就可以生成验证码 保存redis 中  然后发送给客户手机
            //先创建获得redis 连接池对象  jedisPool
            Jedis jedis = jedisPool.getResource();
            // 调用工具类 的方法生成一个验证码信息  最好是一个字符串类型
            String validateCode = ValidateCodeUtils.generateValidateCode(4);
            // 调用 阿里云的 发送短信的方法 给客户发送短息
            /*    SMSUtils.VALIDATE_CODE(telephone,validateCode);*/
            System.out.println("========================验证码为：" + validateCode);
            // 这里的 telephone 是Key 代表客户的唯一标识， 90 代表储存的事件  validateCode 是Value代表 redis中储存的值
            jedis.setex("telephone", 90, validateCode);
            jedis.close();
            return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);
        }
    }

    @RequestMapping("/validateCodeFromRedis.do")
    //这里 为什么写的是：code  因为前端 axios.get("/orderinfo/validateCodeFromRedis.do? code="+this.orderInfo.validateCode
                                                                           // 封装的是code
    public Result validateCodeFromRedis(@RequestParam("code") String code, @RequestParam("telephone" ) String telephone) {
        Jedis jedis = null;
        try {
            //拿到验证码之后 我们就可以生成验证码 保存redis 中
            //先创建获得redis 连接池对象  jedisPool
            jedis = jedisPool.getResource();
            String codeFromRedis = jedis.get(telephone);
            if (codeFromRedis==null||codeFromRedis.trim()==""){
                return  new Result(false,"验证码过期3333333");
            }
            //验证码再有效期之内
            if (code.equals(codeFromRedis)){
                return new Result(true,"验证码正确");
            }else{
                return new Result(false, "验证码错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);
        }
        finally {
            jedis.close();
        }
    }




    @RequestMapping("/addOrder.do")
   /* 注意：
            这里@RequestParam 注入的对象 与实体类 中的数据不匹配  所以这里的实体类注入 使用Map 集合注入
            这种多样化的数据 就可以考虑使用 Map 就能将 前台整个多样化数据 反序列封装到Map 中去
    */
    public Result addOrder(@RequestBody Map map) {
        try {
            // 添加一个 addOrder（map）  方法此时 里面传入 map 此时 就将前端表单 post 发送过来的数据封装进来了
            // 然后 用一个 Orede 实体类作为对象 封装起来
           Order order= orderInfoService.addOrder(map);

        return new Result(true,MessageConstant.ADD_ORDER_SUCCESS,order);
        } catch (Exception e) {
            e.printStackTrace();
            // 这里就直接抛出一个异常  业务层抛出什么错误信息 就是什么信息
            return new Result(false,e.getMessage());
        }
    }

    @RequestMapping("/findOrderDetail.do")
   /* 注意：
            这里@RequestParam 注入的对象 与实体类 中的数据不匹配  所以这里的实体类注入 使用Map 集合注入
            这种多样化的数据 就可以考虑使用 Map 就能将 前台整个多样化数据 反序列封装到Map 中去
    */
    public Result findOrderDetail(@RequestParam("orderid") int orderid) {
        try {
              Map map=  orderInfoService.findOrderDetail(orderid);

            return new Result(true,MessageConstant.ADD_ORDER_SUCCESS,map);
        } catch (Exception e) {
            e.printStackTrace();
            // 这里就直接抛出一个异常  业务层抛出什么错误信息 就是什么信息
            return new Result(false,e.getMessage());
        }
    }

}
